<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
          // ES 2020 出现的方法 ，Promise.allSettled() 方法 和all方法类似
        // 弥补all对于错误处理的能力；
        //收集所有的promise结果，以对象形式装到数组里面来作为返还值，返回一个成功的promise对象，
        // 同时执行多个promise对象

          let p1 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(1111);
            }, 1000);
        })


        let p2 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                // resolve(2222);
                reject("222error");
            }, 2000);
        })


        let p3 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(3333);
            }, 1000);
        })

        // 通过allSettled执行所有的promise对象
       let pas= Promise.allSettled([p1,p2,p3])
        
        pas.then(res=>{
            console.log(res);
        })
        console.log(pas,'pas');
           // Promise.allSettled的实现 ？

           class MyPromise{
            static allSettled(arr){
                return new Promise(resolve=>{
                    // 处理数组里的promise的结果
                    // 需要收集成功 且收集失败的结果。
                    // 创建一个收集结果的空数组；数组的长度是promise对象数组的长度
                    let resArr = new Array(arr.length); // 创建一个指定长度的空数组
                    let count = 0;
                    arr.forEach((item,key)=>{  // key 定位收集的结果再resArr里的位置 
                        item.then(res=>{
                            // 成功了需要收集结果值
                            let obj = {
                                status:"fulfilled",
                                value:res
                            }
                            resArr[key] = obj;
                            // 什么时候把结果值 返还到最外层的then里
                            count++;
                            if(count===arr.length){
                                resolve(resArr)
                            }
                        },err=>{
                            // 失败了也需要收集结果值 
                            let obj = {
                                status:"rejected",
                                reason:err
                            }
                            resArr[key] = obj;
                            count++;
                            if(count===arr.length){
                                resolve(resArr)
                            }
                        })
                    })

                })
            }
        }
    </script>
</body>
</html>